// // 定义 Iterator trait，指定关联类型 Item
// pub trait Iterator {
//     type Item;
//     fn next(&mut self) -> Option<Self::Item>;
// }

// // 定义一个简单结构体 MyStruct
// struct MyStruct {}

// // 为 MyStruct 实现 Iterator trait，Item 类型为 i32
// impl Iterator for MyStruct {
//     type Item = i32;
//     fn next(&mut self) -> Option<Self::Item> {
//         None
//     }
// }

// // 定义 Person 结构体，包含名字和职业信息
// #[derive(Debug)]
// struct Person {
//     first_name: String,
//     last_name: String,
//     occupation: String,
// }

// // 定义 PersonIterator 结构体，用于迭代 Person 的字段
// struct PersonIterator {
//     values: Vec<String>,
// }

// // 定义 IntoIterator trait，提供将类型转换为迭代器的方式
// pub trait IntoIterator {
//     type Item;
//     type IntoIter: Iterator<Item = Self::Item>;
//     fn into_iter(self) -> Self::IntoIter;
// }

// // 为 PersonIterator 实现 Iterator trait，Item 类型为 String
// impl Iterator for PersonIterator {
//     type Item = String;
//     fn next(&mut self) -> Option<Self::Item> {
//         if self.values.is_empty() {
//             return None;
//         }
//         // remove 方法会移除并返回指定索引的元素，同时将后续元素前移
//         Some(self.values.remove(0))
//     }
// }

// // impl Iterator for Person {
// //     type Item = Vec<String>;
// //     fn next(&mut self) -> Option<Self::Item> {
// //         if self.is_empty() {
// //             return None;
// //         }
// //         // remove 方法会移除并返回指定索引的元素，同时将后续元素前移
// //         Some(self.remove(0))
// //     }
// // }

// // impl IntoIter for Person

// // 为 Person 实现 IntoIterator trait，使用 std::vec::IntoIter 作为迭代器类型
// impl IntoIterator for Person {
//     type Item = String;
//     type IntoIter = std::vec::IntoIter<Self::Item>;
//     fn into_iter(self) -> Self::IntoIter {
//         vec![self.first_name, self.last_name, self.occupation].into_iter()
//     }
// }

// fn main() {
//     println!("Hello, world!");
//     let mut my_struct = MyStruct {};
//     let next = my_struct.next();
//     println!("{:?}", next);

//     let p = Person {
//         first_name: "Daniel".to_string(),
//         last_name: "Li".to_string(),
//         occupation: "Software Engineer".to_string(),
//     };

//     // 遍历 Person 实例的字段并打印
//     for item in p {
//         println!("{:?}", item);
//     }
// }

// 不自己定义 Iterator 和 IntoIterator，直接用标准库
struct MyStruct;

impl Iterator for MyStruct {
    type Item = i32;
    fn next(&mut self) -> Option<Self::Item> {
        None
    }
}

#[derive(Debug)]
struct Person {
    first_name: String,
    last_name: String,
    occupation: String,
}

struct PersonIterator {
    values: Vec<String>,
}

impl Iterator for PersonIterator {
    type Item = String;
    fn next(&mut self) -> Option<Self::Item> {
        if self.values.is_empty() {
            None
        } else {
            Some(self.values.remove(0))
        }
    }
}

// 让 Person 支持 for 循环
impl IntoIterator for Person {
    type Item = String;
    type IntoIter = std::vec::IntoIter<Self::Item>;

    fn into_iter(self) -> Self::IntoIter {
        vec![self.first_name, self.last_name, self.occupation].into_iter()
    }
}

fn main() {
    let mut my_struct = MyStruct {};
    println!("{:?}", my_struct.next());

    let p = Person {
        first_name: "Daniel".to_string(),
        last_name: "Li".to_string(),
        occupation: "Software Engineer".to_string(),
    };

    for item in p {
        println!("{:?}", item);
    }
}
